home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
pao
/
tsr
/
src
/
trapver.asm
< prev
next >
Wrap
Assembly Source File
|
1994-06-01
|
16KB
|
497 lines
;============================================================================
; << MASM V5.1 >> for FM TOWNS
;============================================================================
.186
PAGE 60,132
NAME TRAPVER
TITLE TRAP VERSION
;============================================================================
; MS-DOSのバージョン番号をトラップする.
;
; All Rights Reserved, Copyright (C) Y.Hirata 1993.
; Programmed by Y.Hirata ( NIFTY-ID : NAB03321 )
;
; < NOTE >
;============================================================================
code SEGMENT
ASSUME cs:code,ds:code,es:code,ss:code
;----------------------------------------------------------------------------
ORG 000h
SEGTOP LABEL BYTE
;----------------------------------------------------------------------------
ORG 02Ch
ENVADRS LABEL WORD
;----------------------------------------------------------------------------
ORG 080h
ARGUMENT LABEL BYTE
;----------------------------------------------------------------------------
ORG 100h
entry: jmp main
;----------------------------------------------------------------------------
CR EQU 0Dh ;
LF EQU 0Ah ;
BEL EQU 07h ;
TAB EQU 09h ;
EOF EQU 1Ah ;
;
COPYRIGHT DB CR
DB 01Bh,'[2K',CR,LF,BEL
DB CR,LF,TAB
DB 'MS-DOS trap-ver Version 1.00 1993.03.16'
DB CR,LF,TAB
DB CR,LF,TAB
DB 'Copyright (C) Y.Hirata 1993.',CR,LF
DB CR,LF,EOF
;
TITLE_name DB 'TRAP-VER v1.00' ; 常駐チェック文字列
TITLE_len EQU $-TITLE_name ;
;
;****************************************************************************
; データ領域
;****************************************************************************
paraoff LABEL BYTE ;
v_21 DD FAR ; ベクタアドレス
ver DB 3 ; バージョン
lev DB 10 ; レベル
parasize EQU $-paraoff ; パラメタ領域サイズ
;
;****************************************************************************
; MACRO
;****************************************************************************
TSREND MACRO ; プログラム常駐終了(31H)
local close ;
mov cx,5 ; デフォルトオープンファイルのクローズ
close: ;
mov bx,cx ;
dec bx ; ( 0 ~ 4 )
mov ah,3Eh ; ファイルクローズ
int 21h ;
loop close ;
;
mov si,OFFSET ENVADRS ; 環境変数領域を開放
mov ax,cs:[si] ;
mov es,ax ;
mov ah,49h ;
int 21h ;
;
mov dx,OFFSET SEGEND ;
add dx,15 ;
shr dx,4 ; パラグラフ単位
mov ax,3100h ;
int 21h ; 常駐終了
ENDM ;
;----------------------------------------------------------------------------
PRGEND MACRO ; プログラム終了(4CH)
mov ax,4C00h ;
int 21h ; Program End !
ENDM ;
;----------------------------------------------------------------------------
INT21H MACRO ; DOS call
pushf ;
call cs:[v_21] ;
ENDM ;
;
;****************************************************************************
; 常駐処理部
;****************************************************************************
;----------------------------------------------------------------------------
; 割り込みフック処理 ;
;----------------------------------------------------------------------------
i21h PROC FAR ;
cmp ah,30h ;
jnz short i21h_org ;
INT21H ; DOS call
mov al,cs:ver ;
mov ah,cs:lev ;
sti ; 割り込み許可
ret 2 ; フラグをpopせずに,iretをシミュレート
i21h_org: ;
jmp cs:[v_21] ; 本来のベクタに処理を移す。
i21h ENDP ;
;----------------------------------------------------------------------------
SEGEND LABEL BYTE ; ↑ここまでを常駐
;----------------------------------------------------------------------------
;
;****************************************************************************
; 非常駐処理部
;****************************************************************************
;----------------------------------------------------------------------------
; 文字列表示(^C無効)
; < IN > : ds:si 文字列格納位置
;
; < USE > : si
;----------------------------------------------------------------------------
puts PROC NEAR ;
push dx ;
putslp: ;
mov dl,[si] ;
or dl,dl ; 文字列終端 ?
jz short putsend ; YES->終了
mov ah,02 ;
int 21h ; 文字表示
inc si ;
jmp short putslp ;
putsend: ;
pop dx ;
ret ;
puts ENDP ;
;----------------------------------------------------------------------------
; ベクタ取得(ds=csでcall)
; < RET > : es:bx ベクタアドレス
;----------------------------------------------------------------------------
getvct: ;
mov ax,3521h ;
int 21h ; 割込みベクタ取得
mov WORD PTR v_21,bx ;
mov WORD PTR v_21+2,es ; 本来の割り込みベクタの取得・保存
ret ;
;----------------------------------------------------------------------------
; 常駐文字列チェック(ds=csでcall)
; < IN > : es 常駐セグメント
; < RET > : ゼロフラグ (等しければ, ゼロフラグon)
;
; < USE > : si, di
;----------------------------------------------------------------------------
tsrcmp: ;
mov cx,TITLE_len ;
mov si,OFFSET TITLE_name ; ds:si
mov di,OFFSET TITLE_name ; es:di
repz cmpsb ; 常駐チェック
ret ;
;----------------------------------------------------------------------------
; 常駐チェック(ds=csでcall)
; < RET > : es:bx 常駐アドレス
;
; < USE > : ax, si, di
;----------------------------------------------------------------------------
tsr_chk: ;
mov BYTE PTR tsrflg,0 ; 常駐フラグクリア
mov BYTE PTR hookflg,0 ; ベクタフックフラグクリア
mcb_chk: ;
mov ah,52h ; 内部変数領域アドレス取得
int 21h ;
mov es,es:[bx-2] ; 先頭MCBセグメントアドレス
mcb_lp: ;
cmp BYTE PTR es:[0],'Z' ; 最終MCB ?
je short mcb_end ; YES->終了
cmp BYTE PTR es:[0],'M' ; MCB ?
jne short mcb_err ; NO ->MCB MARK ERROR
mcb_idchk: ;
push es ; MCBセグメント退避
mov es,WORD PTR es:[1] ; PSPセグメント(Owner ID)
mov ax,es ;
cmp ax,pspseg ; 起動プログラムのPSPか ?
je short mcb_next ; YES->次のMCBをチェック
call tsrcmp ; 常駐文字列照合
jz short mcb_on ; 等しければ, 常駐済
mcb_next: ;
pop es ; MCBセグメント復元
mov ax,es ;
add ax,es:[3] ; 使用メモリのパラグラフ数加算
inc ax ; 次のMCBセグメント
mov es,ax ;
jmp short mcb_lp ;
mcb_on: ; 常駐済
pop ax ; スタック調整
mov BYTE PTR tsrflg,1 ;
mcb_end: ; 非常駐
push bx ;
push es ;
call getvct ; 割込みベクタ取得
pop es ;
pop bx ;
vctchk_21: ;
mov ax,es ;
cmp WORD PTR v_21+2,ax ; 常駐セグメント比較
je short vctchk_99 ;
mov BYTE PTR hookflg,1 ; ベクタフックされている
vctchk_99: ;
ret ;
mcb_err: ;
mov si,OFFSET msg6 ; MCBエラー
call puts ;
ret ;
;----------------------------------------------------------------------------
; プログラム名の設定(es=ds=csでcall)
; 常駐時の識別用として, コマンドライン領域にプログラム名を複写しておく.
;----------------------------------------------------------------------------
setpname: ;
mov si,OFFSET prgname ;
mov di,OFFSET ARGUMENT ;
mov cx,prgnamelen ;
rep movsb ; ds:si->es:di
ret ;
;----------------------------------------------------------------------------
; 初期処理(es=ds=csでcall)
;----------------------------------------------------------------------------
init: ;
mov ah,30h ; get dos version
cmp BYTE PTR tsrflg,0 ; 常駐していない ?
jnz short init_fcall ; NO->far call
int 21h ;
jmp short init_set ;
init_fcall: ;
INT21H ;
init_set: ;
mov defver,al ;
mov deflev,ah ;
ret ;
;----------------------------------------------------------------------------
; 起動処理( メイン )
;----------------------------------------------------------------------------
main PROC NEAR ;
mov WORD PTR pspseg,es ; PSPセグメント保存
cli ; 割り込み禁止
cld ;
;
mov si,OFFSET msg0 ; オープニングメッセージ(文字列)
call puts ;
call tsr_chk ; 常駐チェック
cmp BYTE PTR tsrflg,0 ; 常駐していない ?
jz short arg_chk ; YES->arg_chk
;
push ds ; 常駐領域内パラメタを複写
push es ;
mov ax,es ;
push ds ;
pop es ;
mov ds,ax ; ds<->es
mov si,OFFSET paraoff ;
mov di,OFFSET paraoff ;
mov cx,parasize ; パラメタ領域サイズ
rep movsb ; ds:si->es:di
pop es ;
pop ds ;
arg_chk: ;
call init ; 初期処理
sti ;
call argchk ; 引数のチェック
mov al,argflg ;
or al,al ; al=0 ?
jz short tsr_init ; YES->通常処理開始へ
mov si,OFFSET usage ; ヘルプメッセージ
call puts ;
PRGEND ;
tsr_init: ;
mov al,tsrflg ; 常駐フラグ
or al,al ; 常駐しているか ?
jz short mem_noclr ; NO->非常駐処理へ
;-------------------------------------------;
; 常駐解除処理
;-------------------------------------------;
mem_clear: ;
mov al,relflg ; 常駐解除フラグ
or al,al ; 常駐解除しない ?
jz short mem_update ; YES->終了
mem_clrchk: ;
cmp BYTE PTR hookflg,0 ; ベクタフックされていないか ?
je short mem_clear_ok ; YES->常駐解除
mov si,OFFSET msg7 ; 常駐解除不可メッセージ
call puts ;
PRGEND ;
mem_clear_ok: ;
push ds ;
lds dx,DWORD PTR es:v_21 ;
mov ax,2521h ; 割り込みベクタを元に戻す!
int 21h ;
mov ah,49h ; プログラムを開放
int 21h ;
pop ds ;
jc short mem_clrerr ; メモリ開放失敗
mov si,OFFSET msg2 ; 開放メッセージ
jmp short mem_clrend ;
mem_clrerr: ;
mov si,OFFSET msg8 ; メモリ開放失敗メッセージ
mem_clrend: ;
call puts ;
PRGEND ;
;
mem_update: ; 常駐領域内のパラメタ値変更
mov si,OFFSET msg3 ; 常駐済メッセージ
call puts ;
mov al,optflg ;
or al,al ; オプション指定なし ?
jz short mem_upend ; YES->終了
cli ;
mov si,OFFSET paraoff ;
mov di,OFFSET paraoff ;
mov cx,parasize ; パラメタ領域サイズ
rep movsb ; ds:si->es:di
sti ;
mov si,OFFSET msg5 ; アップデートメッセージ(文字数)
call puts ;
mem_upend: ;
PRGEND ;
;
mem_noclr: ;
mov al,relflg ; 常駐解除フラグ
or al,al ; 常駐解除 ?
jz short mem_setup ; NO->常駐処理へ
mov si,OFFSET msg4 ; 非常駐メッセージ
call puts ;
PRGEND ;
;-------------------------------------------;
; 常駐処理
;-------------------------------------------;
mem_setup: ;
push cs ;
pop es ; es=cs
call setpname ;
mov si,OFFSET msg1 ; 常駐メッセージ
call puts ;
;
mov dx,OFFSET i21h ; 常駐処理プロシジャを
mov ax,2521h ; ベクタセット
int 21h ;
;
TSREND ; 常駐終了
;----------------------------------------------------------------------------
; 引数のチェック
;----------------------------------------------------------------------------
argchk: ; 引数のチェック
mov bx,OFFSET ARGUMENT ;
mov BYTE PTR optflg,0 ;
arglp: ;
inc bx ;
mov al,[bx] ;
cmp al,CR ;
jne short optchk ;
ret ; 引数チェック終了
optchk: ; 引数チェック開始
cmp al,'-' ; オプションスイッチは'-','/'で始まる.
je short optsw1 ;
cmp al,'/' ;
je short optsw1 ;
cmp al,' ' ; SPACE
je short arglp ;
cmp al,TAB ; TAB
je short arglp ;
jmp opterr ;
optsw1: ;
inc bx ;
mov al,[bx] ;
or al,20H ; 大文字->小文字
cmp al,'r' ; 'r','R'か ?
jne short optsw2 ; NO->次のチェックへ
mov BYTE PTR relflg,1 ; 常駐解除フラグ ON
jmp short arglp ;
optsw2: ; R/W以外のファンクション表示
cmp al,'v' ; 'v'か ?
jne short opterr ; NO->次のチェックへ
call atoi ;
cmp BYTE PTR valflg,0 ; 数値指定あり ?
jne short optsw2chk ; YES->数値チェックへ
mov al,[bx+1] ;
cmp al,'.' ; 小数点 ?
jz short optsw2th ; YES->小数点チェックへ
mov al,defver ;
mov ver,al ; 標準値設定
jmp short optsw2def ;
optsw2chk: ;
mov ver,al ; 値格納
mov al,[bx+1] ;
cmp al,'.' ; 小数点 ?
jnz short optswon ; NO->次のチェックへ
optsw2th: ;
inc bx ;
call atoi ;
cmp BYTE PTR valflg,0 ; 数値指定あり ?
jne short optsw2lev ; YES->数値チェックへ
optsw2def: ;
mov al,deflev ;
mov lev,al ; 標準値設定
jmp short optswon ;
optsw2lev: ;
mov lev,al ; 値格納
jmp short optswon ;
optpause: ;
mov al,[bx+1] ;
cmp al,' ' ; SPACE
je short arglp ;
cmp al,TAB ; TAB
je short arglp ;
cmp al,CR ; 終了
je short arglp ;
jmp optsw1 ;
optswon: ;
mov BYTE PTR optflg,1 ; オプションスイッチ ON
jmp short optpause ;
opterr: ; オプションスイッチエラー
mov BYTE PTR argflg,1 ;
ret ;
;----------------------------------------------------------------------------
; 文字列を整数に変換
; < IN > : ds:bx 文字列の先頭位置-1
; < RET > : ax 整数値
;
; < USE > : bx, cx, dx
;----------------------------------------------------------------------------
atoi: ;
inc bx ;
xor ax,ax ; ax=0
xor dx,dx ; dx=0
xor ch,ch ; ch=0
mov BYTE PTR valflg,0 ;
atoi_next: ;
mov cl,[bx] ; 文字コード取得
sub cl,'0' ; 文字->数字
jb short atoi_end ; '0'よりも小さければ終わり
cmp cl,9 ; '9'よりも大きいか ?
ja short atoi_end ; YESならば終わり
push cx ;
mov cx,0AH ;
imul cx ; AXを10倍する
pop cx ;
add ax,cx ; AXに新値を格納
inc bx ; 次の文字位置
mov BYTE PTR valflg,1 ;
jmp short atoi_next ;
atoi_end: ;
dec bx ; 先読み分を戻す
ret ;
;
main ENDP ;
;
tsrflg DB 0 ; 常駐フラグ
argflg DB 0 ; 引数チェックフラグ
optflg DB 0 ; オプションフラグ
valflg DB 0 ; オプション数値フラグ
relflg DB 0 ; 常駐解除フラグ
hookflg DB 0 ; ベクタフックフラグ
;
defver DB ? ;
deflev DB ? ;
;
pspseg DW ? ; PSPセグメント
prgname DB 14,'TRAP-VER v1.00',CR ;
prgnamelen EQU $-prgname ;
;
msg0 DB CR,LF,'MS-DOS trap-ver Version 1.00 (C)パオパオ 1993. '
DB CR,LF,0
msg1 DB '★ 常駐します ★',CR,LF,0
msg2 DB '☆ 常駐解除しました ☆',CR,LF,0
msg3 DB '常駐しています.',CR,LF,0
msg4 DB '常駐していません.',CR,LF,BEL,0
msg5 DB 'オプションパラメタ値を更新しました.',CR,LF,BEL,0
msg6 DB 'メモリの状態が正しくありません.',CR,LF,BEL,0
msg7 DB 'ベクタをフックされているため, 常駐解除できません.'
DB CR,LF,BEL,0
msg8 DB 'メモリの開放に失敗しました.',CR,LF,BEL,0
;
usage DB "Usage: 'TRAPVER "
DB "[-r] [-v[d.f]]'"
DB CR,LF
DB ' -r 常駐解除 ',CR,LF
DB ' -v[d.f] バージョン '
DB ' 標準例: 3.10',CR,LF
DB 0
;
code ENDS ;
END entry ;
;
; < HISTORY >
;============================================================================
; 1993.03.16 : CREATE
;============================================================================